package poo.date;

import java.util.*;

public class DataEnum implements Comparable<DataEnum> {

	private final int G, A;
	private final Mese M;

	public enum Tipo {
		GIORNO, MESE, ANNO
	};

	public enum Mese {
		GENNAIO(31), FEBBRAIO(28) {
			public int durata(int anno) {
				if (anno % 4 != 0 || anno % 100 == 0 && anno % 400 != 0)
					return durata;
				return durata + 1;
			}// durata
		},

		MARZO(31), APRILE(30), MAGGIO(31), GIUGNO(30), LUGLIO(31), AGOSTO(31), SETTEMBRE(
				30), OTTOBRE(31), NOVEMBRE(30), DICEMBRE(31);
		protected int durata; // variabile d'istanza

		Mese(int durata) {// costruttore
			this.durata = durata;
		}

		public int durata(int anno) {// metodo d'istanza
			return durata;
		}
	}// Mese

	public DataEnum() {// costruttore di default
		GregorianCalendar gc = new GregorianCalendar();
		G = gc.get(GregorianCalendar.DAY_OF_MONTH);
		M = Mese.values()[gc.get(GregorianCalendar.MONTH) + 1];
		A = gc.get(GregorianCalendar.YEAR);
	}// DataEnum

	public DataEnum(int g, Mese m, int a) {// su M non sono possibili errori
		if (a < 0 || g < 1 || g > durataMese(m, a))
			throw new IllegalArgumentException();
		this.G = g;
		this.M = m;
		this.A = a;
	}// DataEnum

	public DataEnum(DataEnum d) {
		G = d.G;
		M = d.M;
		A = d.A;
	}// DataEnum

	public static int durataMese(Mese m, int a) {
		if (a < 0)
			throw new IllegalArgumentException();
		return m.durata(a);
	}// durataMese

	public DataEnum giornoPrima() {
		if (G == 1 && M == Mese.GENNAIO && A == 0)
			throw new RuntimeException("Prima Data");
		int g;
		int a = this.A;
		Mese m = this.M;
		if (this.G == 1) {// determina mese precedente
			if (this.M.compareTo(Mese.GENNAIO) > 0)
				m = Mese.values()[M.ordinal() - 1];
			else {
				m = Mese.DICEMBRE;
				a = this.A - 1;
			}
			g = durataMese(m, a);
		} else
			g = this.G - 1;
		return new DataEnum(g, m, a);
	}// giornoPrima

	@Override
	public int compareTo(DataEnum arg0) {
		// TODO Auto-generated method stub
		return 0;
	}

	// ALTRI METODI: ESERCIZI A FINE CAPITOLO 161
}
